package kr.co.bettersoft.waitnumberstoret.activity;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import kr.co.bettersoft.waitnumberstoret.common.CommonConstant;
import kr.co.bettersoft.waitnumberstoret.common.CommonUtils;
import kr.co.bettersoft.waitnumberstoret.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstoret.domain.EventNotice;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class MainNoticeWriteActivity extends Activity{
	////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수 

	String TAG = "MainNoticeWriteActivity";

	public final int REQ_CODE_PICK_PICTURE = 601;				// 이미지 선택 코드. activity result 받기 위한 값
	public final int REGISTER_NOTICE = 602;						// 공지 등록 관련 서버 통신 메소드 호출 코드
	public final int MAX_WIDTH = kr.co.bettersoft.waitnumberstoret.common.CommonConstant.EVENT_IMAGE_SIZE_BIG;				// 공지 이미지 큰변 길이 800
	public final int MAX_HEIGHT = CommonConstant.EVENT_IMAGE_SIZE_SMALL;			// 공지 이미지 작은변 길이 600

	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;
	
	// 가맹점 아이디 	
	String merchantId = "";

	// 공용 프립스	
	SharedPreferences sharedPrefCustom;

	// 서버 통신
	int isRunning = 0;		// 통신 도중 중복 호출을 방지하기 위함.
	WaitnumberStoreMRest waitnumberStoreMRest;
	String callResult = "";
	String tempstr = "";
	JSONArray jsonArray;

	// 가맹점 공지사항 
	// ... 

	// 선택한 이미지
	public static Bitmap selectedImg = null;

	// 화면 구성
	TextView titleBar;		// 타이틀
	Button  selectImgBtn;			// 이미지 선택 버튼
	Button  deleteImgBtn;			// 이미지 삭제 버튼
	ImageView selectImgThumbView;	// 섬네일 이미지
	EditText noticeWriteTitle;		// 공지 제목
	EditText noticeWriteContent;	// 상세 내용
	TextView eventRegisterWriteGuideTxt; 	// 안내 문구
	Button  registerBtn;		// 공지 등록 버튼		
	ProgressBar pb1;				// 중단 로딩 진행바

	Button topNaviCloseBtn; 		// 상단 닫기 버튼
	
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;		
	InputMethodManager imm;
	


	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 핸들러 설정

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			try{
				Bundle b = msg.getData();		
				if(b.getInt("showYN")==1){
					isRunning = 0;
				}
				if(b.getInt("initScreen")==1){
					selectImgThumbView.setImageDrawable(getResources().getDrawable((R.drawable.design_register_event_no_image)));	// ### 
					noticeWriteTitle.setText("");
					noticeWriteContent.setText("");
					selectedImg = null;
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}else if(b.getInt("showAlert")==4){
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							//
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					pb1.setVisibility(View.INVISIBLE);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(MainNoticeWriteActivity.this, getString(R.string.failed_to_open_page), Toast.LENGTH_SHORT).show();
					// 페이지를 불러오는데 실패했습니다.\n잠시후 다시 시도해주시기 바랍니다.	
				}

				switch (msg.what)
				{
				case REGISTER_NOTICE : runOnUiThread(new RunnableRegisterNotice());			
					break;
				default : 
					break;
				}


			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
//		Log. w(TAG,"onCreate");
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
		setContentView(R.layout.main_notice_write_activity);

		waitnumberStoreMRest = new WaitnumberStoreMRest();

		parentLayout = findViewById(R.id.notice_write_parent_layout);	
		
		topNaviCloseBtn = (Button) findViewById(R.id.top_navi_close_btn);
		// 상단 닫기 버튼
		topNaviCloseBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
		titleBar = (TextView) findViewById(R.id.title_bar);
		selectImgBtn  = (Button) findViewById(R.id.select_img_btn);
		deleteImgBtn  = (Button) findViewById(R.id.delete_img_btn);
		registerBtn  = (Button) findViewById(R.id.register_btn);
		selectImgThumbView = (ImageView) findViewById(R.id.select_img_thumb_view);
		noticeWriteTitle = (EditText) findViewById(R.id.notice_write_title);
		noticeWriteContent = (EditText) findViewById(R.id.notice_write_content);
		eventRegisterWriteGuideTxt = (TextView) findViewById(R.id.event_register_write_guide_txt);
		pb1=(ProgressBar) findViewById(R.id.notice_write_progressbar);

		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
	    titleBar.setTypeface(typefaceNanumGothic);
	    eventRegisterWriteGuideTxt.setTypeface(typefaceNanumGothic);
	    registerBtn.setTypeface(typefaceNanumGothicBold);
		
		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
//				Log. w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(noticeWriteTitle.getWindowToken(), 0);
			}
		});
		
		// 이미지 선택하기
		selectImgBtn.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(noticeWriteTitle.getWindowToken(), 0);
				Intent imgSelectIntent = new Intent(Intent.ACTION_PICK);
				imgSelectIntent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
				imgSelectIntent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);	// images on the SD card

				// 결과를 리턴하는 activity 호출
				startActivityForResult(imgSelectIntent, REQ_CODE_PICK_PICTURE);	
			}
		});  
		// 이미지 삭제하기
		deleteImgBtn.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(noticeWriteTitle.getWindowToken(), 0);
				
//				Uri curImgURI = data.getData();
				try {
//					selectedImg = Images.Media.getBitmap(getContentResolver(), curImgURI );
					Drawable drawableNoImg = getResources().getDrawable(R.drawable.sub7_4);
					BitmapDrawable bmpDrawableNoImg = (BitmapDrawable) drawableNoImg;
					selectedImg = bmpDrawableNoImg.getBitmap(); 
					// 섬네일 초기화
					selectImgThumbView.setImageBitmap(selectedImg);
					selectedImg = null;
				} catch (Exception e) { e.printStackTrace(); }
				
//				Intent imgSelectIntent = new Intent(Intent.ACTION_PICK);
//				imgSelectIntent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
//				imgSelectIntent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);	// images on the SD card
//				
//				// 결과를 리턴하는 activity 호출
//				startActivityForResult(imgSelectIntent, REQ_CODE_PICK_PICTURE);	
			}
		});  

		// 등록하기
		registerBtn.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				if((noticeWriteTitle.getText()+"").length()<1){
					// 제목을 입력하세요.
					showResultDialog(getString(R.string.register_event_subject_hint));
				}else if((noticeWriteContent.getText()+"").length()<1){		
					// 내용을 입력하세요.
					showResultDialog(getString(R.string.register_event_content_hint));
				}else{
					handler.sendEmptyMessage(REGISTER_NOTICE);
//						registerNotice();
					
				}
			}
		});
		
		// noticeRegisterBtn.onClick

		Log.d(TAG,"now mil :" + CommonUtils.getNowDateMiliSec());

		// 가맹점 아이디를 꺼낸다.
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		merchantId = sharedPrefCustom.getString("merchantId", "");

		// 키보드 숨기기
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
		imm .hideSoftInputFromWindow(noticeWriteTitle.getWindowToken(), 0);
	}


	///////////////////////////////////// 	 /////////////////////////////////////

	//   로그 
	public void alertToUser(){				// 	data 조회가  안됐어요. 
		Log.d(TAG,"Get Data from Server -> Error Occured..");
	}


	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	/**
	 * 러너블.  공지를 등록한다
	 */
	class RunnableRegisterNotice implements Runnable {
		public void run(){
			new backgroundThreadRegisterNotice().execute();
		}
	}
	/**
	 * backgroundThreadRegisterNotice
	 * 비동기    서버와 통신하여 공지를 등록한다
	 * @author blue
	 *
	 */
	public class backgroundThreadRegisterNotice extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadRegisterNotice");

			// 파라미터 세팅x
			EventNotice eventNoticeParam = new EventNotice();
			eventNoticeParam.setMerchantId(merchantId);
			eventNoticeParam.setSubject(noticeWriteTitle.getText().toString());
			eventNoticeParam.setContent(noticeWriteContent.getText().toString());
			eventNoticeParam.setMerchantId(merchantId);
			eventNoticeParam.setMerchantId(merchantId);
			
			if(selectedImg == null){
				eventNoticeParam.setImageFileUrl("");
//				 mpEntity.addPart("file", new StringBody(""));
//				params.add(new BasicNameValuePair("file", ""));		// ? 파일이 없을때 공백으로 보내면 에러가 발생함. 안보내도 에러가 발생함.
			}else{
				Log.d(TAG,"img size:"+selectedImg.getWidth()+"x"+selectedImg.getHeight());
				selectedImg = resizeBitmapImage(selectedImg, MAX_WIDTH, MAX_HEIGHT);	 		// resize
				Log.d(TAG,"img size2:"+selectedImg.getWidth()+"x"+selectedImg.getHeight());
				
				eventNoticeParam.setImageFile(selectedImg);
			}
			
			// 서버 통신
			showPb();
			try {
				if(selectedImg == null){
					callResult = waitnumberStoreMRest.RestRegisterNotice(eventNoticeParam);		
				}else{
					callResult = waitnumberStoreMRest.RestRegisterNoticeWithImage(eventNoticeParam,returnThis());		
				}
				Log.d(TAG,"callResult::"+callResult);
			} catch (Exception e) {
				e.printStackTrace();
			} 
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){
				initScreen();		// 화면 초기화
				showResultDialogAndFinish(getString(R.string.event_register_success));
			}else{
				isRunning = 0;
				showResultDialog(getString(R.string.event_register_fail));
				//					getDBData();			// db에서 꺼내서 보여준다.
			}
			return null; 
		}
	}

	///////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 이미지 선택 결과를 받아 처리한다.
	 */
	@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){
		if(requestCode == REQ_CODE_PICK_PICTURE){
			if(resultCode==Activity.RESULT_OK){
				//					selectImgThumbView.setImageURI(data.getData());	// 선택한 사진 URI 로 연결하기

				// uri 에서 이미지 가져오기
				Uri curImgURI = data.getData();
				try {
					selectedImg = Images.Media.getBitmap(getContentResolver(), curImgURI );
				} catch (Exception e) { e.printStackTrace(); }
				// 섬네일 적용
				selectImgThumbView.setImageBitmap(selectedImg);
			}
		}
	}


	//////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * Bitmap이미지의 가로, 세로 사이즈를 리사이징 한다.
	 * 
	 * @param source 원본 Bitmap 객체
	 * @param maxResolution 제한 해상도
	 * @return 리사이즈된 이미지 Bitmap 객체
	 */
	public Bitmap resizeBitmapImage(Bitmap source, int maxWidth, int maxHeight)		// maxWidth 800 maxHeight 600
	{
		int width = source.getWidth();
		int height = source.getHeight();

		Bitmap resizedBitmapImage;
		
		if(width > height)		// 너비가 더 크면 800 * 600
		{
			resizedBitmapImage = Bitmap.createScaledBitmap(source, maxWidth, maxHeight, true);
		}
		else					// 높이가 더 크면 600 * 800
		{
			resizedBitmapImage = Bitmap.createScaledBitmap(source, maxHeight, maxWidth, true);
		}
		return resizedBitmapImage;
	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////	
	//		Util	
	
	/**
	 * 컨택스트 리턴
	 */
	public Context returnThis(){
		return this;
	}

	/**
	 * showInfo
	 *  결과를 화면에 뿌려준다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showInfo(){
		hidePb();
		//  가져온 데이터 화면에 보여주기.
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("showYN", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}

	/**
	 * 화면을 초기화한다.
	 */
	public void initScreen(){
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				b.putInt("initScreen", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	
	/**
	 * showResultDialog
	 *   얼럿 띄운다 
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialog(final String msg){
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * showResultDialogAndFinish
	 *   얼럿 띄운다 
	 *
	 * @param msg
	 * @param
	 * @return
	 */

	public void showResultDialogAndFinish(final String msg){
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 4);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	/**
	 * showErrMsg
	 *  화면에 error 토스트 띄운다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showErrMsg(){			// 화면에 error 토스트 띄움 
		MainNoticeWriteActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showErrToast", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
}
